package cn.itcast.order.quartz;

import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.quartz.JobDetailFactoryBean;
import org.springframework.scheduling.quartz.SimpleTriggerFactoryBean;

//@Configuration
public class QuartzConfig {

    /**
     * JobDetail：作业详情
     *
     * 主要作用是将任务与其相关的元数据进行绑定
     * 例如任务的名称、组名、任务类等。
     * 这些信息可以帮助调度器在触发器触发时找到正确的任务实例并执行它。
     * JobDetail还可以携带一些额外的属性，这些属性可以在任务执行期间被访问和使用。
     * @return
     */
    @Bean
    public JobDetailFactoryBean jobDetail() {
        JobDetailFactoryBean factory = new JobDetailFactoryBean();
//        factory.setJobClass(MyQuartzJob.class); // 指定作业类
        factory.setDescription("My Quartz Job");
        /**
         * JobDetailFactoryBean的setDurability方法用于指定当没有触发器（Trigger）与之关联时，
         * 作业（Job）是否仍然要被保留在调度器（Scheduler）中。
         * 如果将持久性设置为true，则即使没有触发器引用该作业，作业也会被保留在调度器中。
         * 这通常用于那些需要长期存在并可能在将来某个时间点由新的触发器触发的作业。
         */
        factory.setDurability(true);
        return factory;
    }

    /**
     * Trigger：触发器
     *
     * 定义了作业的执行时间规则。
     * 有两种主要类型：SimpleTrigger和CronTrigger。
     * SimpleTrigger通过代码方式设置触发频率，
     * 而CronTrigger则通过设置cron表达式的方式来控制触发频率。
     * @param jobDetail
     * @return
     */
    @Bean
    public SimpleTriggerFactoryBean trigger(JobDetail jobDetail) {
        SimpleTriggerFactoryBean factory = new SimpleTriggerFactoryBean();
        factory.setJobDetail(jobDetail);
        factory.setRepeatInterval(5000); // 每隔5秒执行一次
        factory.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY); // 无限次重复
        return factory;
    }
}